package com.ming.tool;

import com.ming.mapper.EmpMapper;
import com.ming.pojo.entity.Emp;
import com.ming.util.PasswordUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 密码迁移工具 - 将数据库中的明文密码转换为加密格式
 *
 * 使用方法：
 * 1. 将此类添加到Spring Boot主类的@ComponentScan中
 * 2. 或者直接在主类中实现CommandLineRunner
 * 3. 启动应用时会自动执行密码迁移
 */
@Slf4j
@Component
public class PasswordMigrationTool implements CommandLineRunner {

    @Autowired
    private EmpMapper empMapper;

    @Override
    public void run(String... args) throws Exception {
        // 检查是否需要执行密码迁移
        if (args.length > 0 && "migrate-passwords".equals(args[0])) {
            log.info("开始执行密码迁移...");
            migratePasswords();
        }
    }

    /**
     * 迁移所有明文密码为加密格式
     */
    public void migratePasswords() {
        try {
            List<Emp> employees = empMapper.list();
            int migratedCount = 0;
            int skippedCount = 0;

            for (Emp emp : employees) {
                if (needsMigration(emp.getPassword())) {
                    String oldPassword = emp.getPassword();
                    String newEncryptedPassword = PasswordUtils.generateStoredPassword(oldPassword);

                    // 更新密码
                    emp.setPassword(newEncryptedPassword);
                    empMapper.update(emp);

                    log.info("密码迁移成功 - 用户: {}, 原密码: {}, 新密码: {}",
                            emp.getUsername(), oldPassword, newEncryptedPassword);
                    migratedCount++;
                } else {
                    log.debug("跳过密码迁移 - 用户: {}, 密码已经是加密格式", emp.getUsername());
                    skippedCount++;
                }
            }

            log.info("密码迁移完成! 迁移成功: {} 个, 跳过: {} 个", migratedCount, skippedCount);

        } catch (Exception e) {
            log.error("密码迁移失败", e);
            throw new RuntimeException("密码迁移失败: " + e.getMessage(), e);
        }
    }

    /**
     * 检查密码是否需要迁移
     */
    private boolean needsMigration(String password) {
        if (password == null) {
            return false;
        }

        // 如果包含$符号，说明已经是新的加密格式
        if (password.contains("$")) {
            String[] parts = password.split("\\$", 2);
            return parts.length != 2;
        }

        // 明文密码或简单MD5密码都需要迁移
        return true;
    }

    /**
     * 手动调用迁移方法
     */
    public static void main(String[] args) {
        System.out.println("密码迁移工具");
        System.out.println("使用方法：");
        System.out.println("1. 启动应用时传入参数: java -jar your-app.jar migrate-passwords");
        System.out.println("2. 或者在代码中直接调用 PasswordMigrationTool.migratePasswords() 方法");
        System.out.println();
        System.out.println("注意：请在执行前备份数据库！");
    }
}